import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O

import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv("boston_housing.csv")
#显示前5行
# print(df.head())

# 样本数目和特征维数
# print(df.shape)

#列的名字
# print(df.columns)

# 对数值型特征，得到每个特征的描述统计量
# print(df.describe())

# 数值型特征
# 直方图
# seaborn的distplot方法可以对数值型特征绘制直方图（distribution plot）

# 目标y（房屋价格）的直方图／分布
# fig = plt.figure()
# sns.distplot(df["MEDV"], bins=30, kde=True)
# plt.xlabel("Median value of owner-occupied homes")
# plt.show()

# 目标y（犯罪率）的直方图／分布
# fig = plt.figure()
# sns.distplot(df["CRIM"], bins=30, kde=False)
# plt.xlabel("crime rate")
# plt.show()

#使用DataFrame的hist()方法也可以绘制直方图（histogram）
#distplot绘图的纵轴为样本的比例，hist方法绘图的纵轴为样本数目
# features = ["MEDV", "CRIM"] #可以一次指定多个特征
# df[features].hist()
# plt.show()

# 箱线图
# _, axes = plt.subplots(1, 2, sharey=True, figsize=(6, 4))
# sns.boxplot(data=df["MEDV"], ax=axes[0])
# sns.violinplot(data=df["MEDV"], ax=axes[1])
# plt.show()

# 离散型特征（类别型特征）

# 频率表 value_counts()
# print(df["CHAS"].value_counts())

# 条形图 countplot
# 频率表的图形化表示是条形图

#离散型/类别型特征的分布可用countplot(纵轴为样本数目)
# sns.countplot(df["CHAS"], order=[0,1])
# plt.xlabel("Charles River")
# plt.ylabel("Number of occurrences")
# plt.show()

# 条形图countplot和直方图distplot看起来很像，都用于观察特征的分布，不同点：

# 直方图用于查看数值变量的分布，而条形图用于类别特征。
# 直方图的X轴是数值；条形图的X轴可能是任何类型：数字、字符串、布尔值。
# 直方图的X轴是笛卡尔坐标轴；条形的顺序没有事先定义。不过条形经常按照高度排序，也就是值的频率。如果是有序变量，条形通常按照变量的值排序。

# 相关矩阵
cols = df.columns
# 通常认为相关系数大于0.5的为强相关
data_corr = df.corr()
sns.heatmap(data_corr, annot=True)
plt.show()

# print(data_corr.shape)

# 得到相关系数的绝对值，通常认为相关系数的绝对值大于0.5的特征为强相关
# data_corr = data_corr.abs()
# plt.subplots(figsize=(14,14))
# sns.heatmap(data_corr, annot=True)

# Mask unimportant features,突出重要信息
# sns.heatmap(data_corr, mask=data_corr<0.5, cbar=False)
# plt.show()

# threshold = 0.5
# corr_list = []
# size = data_corr.shape[0]

# for i in range(0, size):
#     for j in range(i+1, size):
#         if(data_corr.iloc[i,j] >= threshold and data_corr.iloc[i,j] < 1) or (data_corr.iloc[i,j] < 0 and data_corr.iloc[i,j] <= -threshold):
#             corr_list.append([data_corr.iloc[i,j],i,j])

# s_corr_list = sorted(corr_list, key=lambda x: -abs(x[0]))

# for v,i,j in s_corr_list:
#     print("%s and %s = %.2f" %(cols[i], cols[j], v))

# 散点图
# matplotlib库的scatter()方法 或 seaborn库的jointplot方法（kind参数为scatter）

# plt.scatter(df["RM"], df["MEDV"])
# plt.show()

# sns.jointplot(x="RM", y="MEDV", data=df, kind="scatter")
# plt.show()

# Scatter plot of only the highly correlated pairs
# 使用SVG格式可能导致pairplot变得非常慢
# for v,i,j in s_corr_list:
#     sns.pairplot(df, x_vars=cols[i],y_vars=cols[j])
#     plt.show()

# 参数hue表示类别
# sns.lmplot('RM', 'MEDV', data=df, hue='CHAS', fit_reg=False)

# _, axes = plt.subplots(1, 2, sharey=True, figsize=(10, 4))
# sns.boxplot(x="CHAS", y="MEDV", data=df, ax=axes[0])
# sns.violinplot(x="CHAS", y="MEDV", data=df, ax=axes[1])
# plt.show()